if (typeof T === 'undefined') require('../setup');

T('plus', function () {

  var t = function (addendA, addendB, expected) {
    T.assertEqual(expected, new Decimal(addendA).plus(addendB).valueOf());
  }

  Decimal.config({
    precision: 200,
    rounding: 4,
    toExpNeg: -9e9,
    toExpPos: 9e9
  });

  t(1, 0, '1');
  t(1, -0, '1');
  t(-1, 0, '-1');
  t(-1, -0, '-1');
  t(0, 1, '1');
  t(0, -1, '-1');
  t(-0, 1, '1');
  t(-0, -1, '-1');

  t(1, '0', '1');
  t(1, '1', '2');
  t(1, '-45', '-44');
  t(1, '22', '23');
  t(1, 0144, '101');
  t(1, '0144', '145');
  t(1, '6.1915', '7.1915');
  t(1, '-1.02', '-0.02');
  t(1, '0.09', '1.09');
  t(1, '-0.0001', '0.9999');
  t(1, '8e5', '800001');
  t(1, '9E12', '9000000000001');
  t(1, '1e-14', '1.00000000000001');
  t(1, '3.345E-9', '1.000000003345');
  t(1, '-345.43e+4', '-3454299');
  t(1, '-94.12E+0', '-93.12');
  t('0', 0, '0');
  t('0', '0', '0');
  t(3, -0, '3');
  t(9.654, 0, '9.654');
  t(0, '0.001', '0.001');
  t(0, '111.1111111110000', '111.111111111');
  t(-1, 1, '0');
  t(-0.01, 0.01, '0');
  t(54, -54, '0');
  t(9.99, '-9.99', '0');
  t('0.00000', '-0.000001', '-0.000001');
  t('0.0000023432495704937', '-0.0000023432495704937', '0');
  t(100, 100, '200');
  t(-999.99, '0.01', '-999.98');
  t('10', 4, '14');
  t('03.333', -4, '-0.667');
  t(-1, -0.1, '-1.1');
  t(43534.5435, '0.054645', '43534.598145');
  t('99999', '1', '100000');

  t = function (addendA, addendB, expected, sd) {
    Decimal.precision = sd;
    T.assertEqual(expected, new Decimal(addendA).plus(addendB).valueOf());
  }

  t('9182914763445141913243843569172715469835.4885696227829197845538926', '7633444625534.6271670438', '9182914763445141913243843576806160095370.115', 43);
  t('79344567.9583146261700423456539738617142116267', '76770085769491324895202178331658.82467912070', '76770085769491324895202257676226.7829937468700423456539738617142116267', 75);
  t('8.1572164344501210656681193', '141383742681203268175705548539.5903424774279108405668653', '141383742681203268175705548547.7475589118780319062349846', 87);
  t('3686865567196977754914570753132702.86443144944286374816106555429', '252977292743732124354509767399171006.56792658736276850447471854354498', '256664158310929102109424338152303709.43235803680563225263578409783498', 76);
  t('7772413527479.0292045567366574215506978466', '6951039673098790484081676762223797578.48972170861559580041987995', '6951039673098790484081684534637325057.5189262', 44);
  t('897519.488463768126475213360003650464', '243345915368302813437999412228446907.03319139912318828693096', '243345915368302813437999412229344426.521655167249663500290963650464', 69);
  t('9944701104687189448523634989441.1145387693210320276079647', '76461573432179845156280348475771563.06533912678377627209249', '76471518133284532345728872110761004.179877896', 44);
  t('49868358282915444463601511745776323.6756', '426.127124853', '49868358282915444463601511745776749.802724853', 62);
  t('18829358460454562606796373222566693.8406444934478081754024757172', '245696827314924767344.62999383040940', '18829358460454808303623688147334038.4706383238572081754024757172', 65);
  t('451443519.5', '40545287685504171383686533617478.0379433921591774655032923922180', '40545287685504171383686985060997.537943392159177465503292392218', 85);
  t('9103707265251.90817165947074590284', '7132.1726911109784489', '9103707272384.08086277044919480284', 57);
  t('81132109324361724111675518092.0430089148033907345892402992266', '56280915849510057765284537881333571.97531', '56280996981619382127008649556851664.018318914803390734', 53);
  t('308403067969970653523590678072543444693.024992850150499393849129', '732241040738289252979020347.308655416021872045866556456848136589', '308403067970702894564328967325522465040.333648266172371439715685456848136589', 93);
  t('510539424488693733.41537434134721968131486', '327009.1496755290899995046724660116828516732779', '510539424489020742.56504987043721918598', 38);
  t('581375185201895127979063.3148256', '14356334345.7574898', '581375185201909484313409.0723154', 33);
  t('7402851913927.841295065397846204951008', '3095919939427099869935455000158274400904.445835412', '3095919939427099869935455007561126314832.287130477397846204951008', 76);
  t('4961172832120828815580484602760756.2012712908', '672041039664151754962281595761407065569.95071013621060637157419754', '672046000836983875791097176246009826326.15', 41);
  t('615013136392771057432168892493351121.844', '7501.90719259576291230', '615013136392771057432168892493358623.7511925957629123', 56);
  t('439780502800870192246198170895028338.75503651737499', '54139159349728010041929589316148734373.238719628804657454831809670308', '54578939852528880234175787487043762700', 36);
  t('4825986092816553.7635954902708301975634371809900', '6932262398609128466540251295633274.5129783804352371207490', '6932262398609128471366237388449828.27657387070606731831243718099', 87);
  t('6779555902177154177229771584.099785903065', '7705328232185839682426202564296087172997.525840974954568455125376057221984043', '7705328232192619238328379718473316944581.625626878019568455125376057221984043', 86);
  t('73975703304587932639.2181626587592846793346557', '385064.7711364633520856985649145914899', '73975703304588317703.9892991221113703778995702914899', 65);
  t('5361772037663933234405322789036276.33156433900413166799767144681154137323', '286704590022711173.40544742389525', '5361772037663933521109912811747449.73701176289938166799767', 57);
  t('652545610682383466438682204.42146681125712', '90000817174099471.37775277', '652545610772384283612781675.79921958125712', 83);
  t('30955320958921614617178138289424354927.94679217117720836736847', '9343585893221.056', '30955320958921614617178147633010248149.00279217117720836736847', 93);
  t('99936880718101922830812712583.65032262815572509426570474', '33036974375228768881250337405734899.3544983736263577509194755440416', '33037074312109486983173168218447483.00482100178208284518518', 58);
  t('2403534785699117112878638516815488696057.917378367470941297385927', '6382502380424160003.479677660153263338013088885', '2403534785699117112885021019195912856061.397056027624204635399015885', 85);
  t('4863433553099693015144122064473263537.90580375285849442237159037230012244', '729921864795343627150.6944153828593595441', '4863433553099693745065986859816890688.60021913571785396647159037230012244', 88);
  t('399834116109759859225128.86903386714268063275622585130318202065', '83243301579.66435004343194655785121635608927271', '399834116109843102526708.53338391057462719060744220739245473065', 63);
  t('858875986652204266383404217992.291603983048765141', '6.0926465541742680273373988448676561', '858875986652204266383404217998.3842505372230331683373988448676561', 77);
  t('55771.4302072966318037483204', '5074951905603164297.9', '5074951905603220069.3302072966318037483204', 43);
  t('9932777897276065862443227653669365455342.97666674233819577', '9658865807142952156279.44105819698310', '9932777897276065872102093460812317611000', 37);
  t('742255892921.08552278588490', '92947236971652934320.381863823954476980190144705805612087685', '92947237713908827241.46738660983937698019014470580561', 52);
  t('693483.30191418214', '142589882557.20048662638259170691', '142590576040.50240080852259170691', 57);
  t('4.526207787', '494677.2546106854088', '494681.7808184724088', 48);
  t('30748018.2039098027620849591479954965780808709', '6852918.752696887318295520093985973', '37600936.9566066900803804792419814695780808709', 45);
  t('9458108973104955501.19731713109763438574297', '25483717936.348437947448383180705503437809197004644', '9458108998588000000', 13);
  t('44343536119449484.887983227307430084581470194803169', '687286972712382711.817290490656982837', '731630500000000000', 7);
  t('190892658814671027948020798562.66401', '3077914596519843221.11397426172', '190892658817748942544540641783.77798426172', 87);
  t('5738.75872446155', '29858473503717618435783009538061.2367254587951510324891489061', '29858473503717618435783009500000', 27);
  t('46692439158758833041970355457275102904.33760089680805727178230', '5100.209160709238112205230327', '46692439158758833041970355457275108004.5467616060461694', 54);
  t('6886266974462041003392255811.09', '157963384397039800487731671393.108839212437491153109722732638001', '164849651371501841491123920000', 26);
  t('261560536522656708116178389636.96902957482448266', '43.894270959640597', '261560536522656708116178389680.86330053446507966', 58);
  t('7389329930453.70597654613990586394144740106960', '7516027589853093719738857026838910413.94175665824167286', '7516027589853093000000000000000000000', 16);
  t('14259971637546.243488016880492813', '47.75579735608706408', '14259971637593.999285372967556893', 38);
  t('588735735873509776102380058677.1286952894401', '97.779232460469346660464003276', '588700000000000000000000000000', 4);
  t('92727445890741842949222790332510627.7224808091', '7609679843743118851669318656.448072904050281496386026279208447', '92727453500421686690000000000000000', 19);
  t('7495308563429194517.4950842956952536756132', '26.98098879', '7495308563400000000', 11);
  t('88323438972.9', '3947737028583992592909690304161920258.9068619264090315473722446642669787780455', '3947737028583992592909690392485359231.806861926409031547372', 58);
  t('76964133350127894939591167080295347.29740816733871', '772928008263955477554638996.3016794002524482346051388435140772', '76964134123000000000000000000000000', 12);
  t('93178915455.978234064862278834', '70156785202107872073374655857728.50328804248218', '70156785202107872073467834773184.481522107344458834', 100);
  t('9.09', '81260831717416.97800363', '81260831717426.06800363', 89);
  t('1855445938689865341002697566158764326.79725393455165540', '565.09791800109811921652723361425597442', '1855445938689865341002697566158764891.89517193564977461652723361425597442', 97);
  t('563573389370505100921783994.63820711261296', '6183290606357615817.2201', '563573395553795707279399811.85830711261296', 93);
  t('34682163909803912305.58279868924', '3882592798.71', '34682163913686505104.29279868924', 32);
  t('45556245389463100131676399335223730722.64187559429639385721653', '3139098333707395868305892593215872544698.3980421276727128', '3184654579096858968437568992551096275421.039917', 46);
  t('214681567801880599741149018665.4268904627994045437530044796095081166697', '30.24438352', '214681567801880599741149018695.671273982799404543753004', 54);
  t('8113872603185679969728486212332590783.602055287175599032912451', '6883368621751387.904574695331503', '8113872603185679969735369580954342000', 34);
  t('4473325482.521859322286620356175998427324', '5517383386767642457749850088998162.9878404839737358471115523370', '5517383386767642457749000000000000', 22);
  t('211869120158.6755510559122396323632849492172', '3350176216485535906730909111199110098559.434382853205751669259307', '3350176216485535906730909111410979218718.1099339091179913016225919492172', 84);
  t('4787781.830769633650', '28106931688076101944325980357112766666.4147856541674471029390', '28100000000000000000000000000000000000', 4);
  t('5421870551709971643477646229788.9916151146275027436845830667747596930491', '1294187723.63552000599434', '5421870551709971643478940417512.6271351206218427436845830667747596930491', 84);
  t('66516175033671157522539424787063035.289018415345287705892', '457025403297589.48109451223206526106813370983486534540', '66516175030000000000000000000000000', 10);
  t('420410527375765723.59880359173181300286368456', '51144376163959512362961732882333687.127621078003128120894', '51144376163959512783372260258099410.726', 38);
  t('3.21003346071', '312572971640834499.5651635013104403556411852', '312572971640834502.7751969620204403556411852', 65);
  t('75902636101686648000.6', '359043382984760880361621433096498558.8522232641204', '359043300000000000000000000000000000', 7);
  t('272.20163189736699207276', '8009976948562717694664282.361198237345827', '8009976948562717694664554.56283013471281907276', 93);
  t('93525713224070.09674242841815995541364018052052', '75768676.532480641692742503493', '93525788992746.6', 15);
  t('1744056.272665115358269071', '6706.43717222508571881815348574554893', '1750762.70983734044398788915348574554893', 39);

  Decimal.toExpNeg = Decimal.toExpPos = 0;

  t('4.6011800481717419E-806104423910', '-8.6437098622551564549067098493197906561E-280114', '-8.64370986225515645490670984931979065609999999999999e-280114', 51);
  t('-7.59901046473456174157176600977643736E+928', '3.1554648E+9567428', '3.1554647999999999999999999999999999999999999999999999999999999999999e+9567428', 68);
  t('7.38629782790796531025130356311386902379257377504731E-65498', '-9.996570772195629416377330436034192E+586560433', '-9.99657077219562941637733043603419199e+586560433', 36);
  t('-3.43703754975841976988985601863218657090565779695942448E-584', '-7.04870954464451748226487792925E+6452', '-7.04870954464451748226487792925e+6452', 65);
  t('-4.6389773729060896356268643578053980E+271990', '5.4794710777462795179129364629207044179495471E+68796013', '5.479471077746279517912936462920704417949547099999999999e+68796013', 55);
  t('9.172623893884291050640178462622576979394001E+74551900', '-0.0006992318506880861375813973557823740630779243140040', '9.17262389388429105064017846262257697939400099999999999999999999999999999e+74551900', 72);
  t('6.166E-6244253', '-9.3214367939176849033412886654725530336291E+4194', '-9.3214367939e+4194', 11);
  t('-3.77704574461102506821116718590213463452971444226E+24181884', '7.89843889931508016397563E+54501333520', '7.89e+54501333520', 3);
  t('-2.6442090E-332', '5.661168834684021053299709525328255302698212731427678781E+171776', '5.6611688346840210532997e+171776', 23);
  t('-1.78E-383610148117221', '-8.4613992413390360803256099173E+37044824', '-8.4613992413390360803256099173e+37044824', 61);
  t('1.494273480155723127276787860353929741454585651339923384424E+7030', '3.599955E+6368385830772', '3.599955e+6368385830772', 63);
  t('2.48389743898982686504586E+5990118820', '7.105424023427069964143E+50201321230', '7.10542402342706996e+50201321230', 18);
  t('-4.4958852106290149081075323202084592539E-86', '-5.01557417551668E+7208357370', '-5.01557e+7208357370', 6);
  t('5.983877037E+772055650933', '5.97790820447058150727307175945652943256022347739E+7594931381', '5.983877037e+772055650933', 52);
  t('4.89816458567686737756451385267113E+12101101', '-9.90080E+857552754863', '-9.900799999999999999999999e+857552754863', 25);
  t('7.9045762440256318425790659793143E-4965904173099', '-3.6938684611042279394235224593675E+38389', '-3.69386846110422793942352245e+38389', 27);
  t('9091734240572059777337372169615492503869182301.1247975', '-8.3901616123211619672445427440292E+133319243', '-8.39016161232116196724e+133319243', 21);
  t('-5.7614024596800067218526669656238695848489E+224985466854', '3.2427446481735120819953731236322538554448401584592050E+8378', '-5.7614024596800067218526669656238695848488999999999e+224985466854', 50);
  t('-3.4835323431888473771840263159327068602635020872E+7998239783115', '6.7428100586109632952356510043358059719760985E+2038539186746204', '6.742810058610963295235651004335805971976098499999999999999999999999999999999999e+2038539186746204', 79);
  t('5.35984699E-72107915904', '-7.76276928415635E+61389759002525', '-7.7627692841563499999999999999999999999999999999999999999999999999999999999e+61389759002525', 74);
  t('372', '4.0265633445977342886914858196025527970624174904E+64814780518', '4.0265633445977342886914858196025527970624174904e+64814780518', 49);
  t('3.3495505285238580755935342866555E+716714246983274', '-4.76240159579095E+7974238', '3.34955052852385807559353428665549999999999999999999999999999999999999999999999e+716714246983274', 78);
  t('-1.136660052521958775081132655E+780346585615836', '-1.4135244992E-646125418487', '-1.136660052521958775081132655e+780346585615836', 57);
  t('6.80671234274E+24353107821', '1E+4750938956', '6.80671234274e+24353107821', 35);
  t('4.2085E+131473', '-5.1978121837876172298218903357871360922005E+2099146', '-5.1978121837876172298e+2099146', 20);
  t('-1.85132291032742043751664841732E+6749817', '-5.51291831643359159273855611591861000641174141E-3605', '-1.85132291032742043751664841732e+6749817', 37);
  t('-2.2E+623', '-9.68323984843808465603512E+183103449888', '-9.68323984843808465603512e+183103449888', 44);
  t('-8462160.18230790532620920473885801869', '-6.823491622045784142358976141661068180768388482486E-88', '-8.46216018230790532620920473885801869e+6', 63);
  t('9.584900900395488487116295413021E+117531807633', '6.9324408293249E-1363303', '9.584900900395488487116295413021e+117531807633', 36);
  t('-1.2205998125948126093868793881263340265049E-998794', '3.649848500316357500547879920E+99', '3.649848500316357500547879919e+99', 28);
  t('7.9674746447477270E+32024230', '9.378127937107139691153209079100915E+74421', '7.967474644747727e+32024230', 53);
  t('8.6526468560473890123167324816104194119468735E-45492', '-9.09989833699618989418290584169989921293754881009537E+328', '-9.0998983369961898941829058416998992129375488100953699e+328', 53);
  t('7.3823394401894199541813669526973321281009006E+342964619755', '-2.7835169984777076297255968060492117442353849489382980019E-3932414405016', '7.382339440189419954181366952697332128100900599999999999999999999999999e+342964619755', 70);
  t('5.93767365838216619745732348758017158E+955', '8.9721E+431904020646180', '8.9e+431904020646180', 2);
  t('5.408E-422768', '-4.8335290132E+201375094', '-4.83352901319999999999999999999e+201375094', 30);
  t('-5255068.0825602021074390953683541500', '-4.592648796456153745297889532992250988472527208E+7065130', '-4.592648796456153745297889532992250988472527208e+7065130', 57);
  t('6.59649576007342568868449989E+538872427755185', '891005.33873644936728042736', '6.59649576e+538872427755185', 10);
  t('3.41080223464725380344854090346498493563054230776E+7037668', '3.14842150141E+41335484610639', '3.14842150141e+41335484610639', 77);
  t('6.97755E+6', '2.2877809304854828E+4407', '2.2877e+4407', 5);
  t('-1.194105902974498122551096123E-94894098890', '1.5568136322038996483E-354014309250', '-1.194105902974498122551096122999999999999999999999999999999999999999999999999999e-94894098890', 79);
  t('-4.3582926017193518533450323833708928536970E+625928309325', '-7.78629536748566236211756044018672869112292055163649E+3878224580', '-4.35829260171935185e+625928309325', 18);
  t('4.338817746880378436738495919632651616263614596719991E-16853', '2E+5897995878425272', '2e+5897995878425272', 69);
  t('9.71853832510229703370187576961518504499101205577E+9111269390', '3.2496E+50', '9.71853832510229703370187576961518504499101205577e+9111269390', 48);
  t('-9.2321759503981412397425795826926029942098E+8733527', '-8.7062475124E+556924354520332', '-8.7062475124e+556924354520332', 72);
  t('1.9019789382830376195918378941236968514484E+71410', '-7.99725347286638007091478935373392E+7365295302', '-7.997253472866380070914789353733919999999999999999e+7365295302', 49);
  t('2.7064812231096664184153270330230630627E+8960', '4.44890E+14', '2.7064812e+8960', 8);
  t('6.46583186092292730436357802632474725780631273259822452268E+2939004825', '-6.65941847768578026064519388121523E-28546746064', '6.465831860922927304363578026324e+2939004825', 31);
  t('-8.078E+3315302', '2.15169943796281232304472863921988890E+2567', '-8.07799999e+3315302', 9);
  t('5.8E+39461267787915', '2.5148686588857181692588619317395E-31', '5.8e+39461267787915', 15);
  t('-2.310978793269215902937528986527468629E+99530314910', '-7.923E-1175647952319965', '-2.3109787932692159029375289e+99530314910', 26);
  t('6.9518585698785793563297313E-945937', '6.932072394145325883412710200096049709866325251010349E+68', '6.9320723941453258834127102000960497098663e+68', 41);
  t('8.319E+65', '3.450099689207871250018932572724713674993594305684395175E+1105524162723988', '3.45009968920787125001893257272471367499359430568439517e+1105524162723988', 54);
  t('4.7593360865E+590704292', '4.39E-602', '4.7593360865e+590704292', 14);
  t('-7.4285E-5714', '-6.532075721513261186334596133875081264260077128E-2890085', '-7.4285e-5714', 5);
  t('8.5388207560433728E-487531241199571', '4.6189690903892583097304455452838826E+122511151', '4.6189690903892583097304455452838826e+122511151', 47);
  t('4.402131638E-6217', '6146491945.8', '6.1464919458e+9', 36);
  t('6.61443100729216275764908834386016575464653E+312916490935810', '9.43649732874441825128E-676693579', '6.614431007292162757649088343e+312916490935810', 28);
  t('6.16310007323656E+923827938105', '-5.237117564730560853952E+2717', '6.163100073236559999999999999e+923827938105', 28);
  t('6.407773391879524E-624218926406576', '5.864631545659357543848307123243933897691521705569062751724E-51503787491', '5.8646e-51503787491', 5);
  t('7E+8031229', '4.05349021928512412448845923836308834593E+297765528415', '4.053490219285124124488e+297765528415', 22);
  t('-3.23441338692447615E+731667319946640', '1.6564004817431066315512571583E+8737112727', '-3.234413e+731667319946640', 7);
  t('8.07600E-3167114890609796', '4.49379785612193203546441944699154417651288200E-67617878473229', '4.493797856121932035464419446991544176512882e-67617878473229', 55);
  t('7.10099910618603162602913895464216183877374670763177E-664701', '2.9497134176736888244719710189373062001792229363001946E-7040302304129787', '7.10099910618603162602913895464216183877374670763177e-664701', 69);
  t('-9.8967145096522848735804634E+98677519', '-8.39861E+5784323495519916', '-8.39e+5784323495519916', 3);
});
